/*********************************************************************************
 * Software License Agreement (BSD License)
 * Copyright (c) 2012, Carlos D. Correa (info@ngraph.org)
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of netzen nor the
 *    names of its contributors may be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *********************************************************************************/
#include "glheaders.h"
#include "shortcut.h"
#include "controller.h"
#include "view.h"
#include "graph.h"
#include <assert.h>

#include <string>
using namespace std;
class ShortcutScatterplotMatrix:public Shortcut {
public:
	string viewScatter, viewHist;
	string typeElement;
  ShortcutScatterplotMatrix(string name, string viewScatter, string viewHist, string typeElement): Shortcut(name) {
	  this->viewScatter = viewScatter;
	  this->viewHist = viewHist;
		this->typeElement = typeElement;
  };
  virtual void run() {
	  assert(controller);
	  vector<string> props = controller->getRegisteredProperties(typeElement); 
		vector<string> properties;
	  for(unsigned int k=0;k<props.size();k++) {
			int type = controller->getPropertyType(props[k]);
			if(type == PROPERTY_FLOAT || type == PROPERTY_SIGNED) {
				properties.push_back(props[k]);
			}
		}

		int numProps = min(5, (int) properties.size());
		unsigned int gridy = numProps;
		unsigned int gridx = numProps;
    for(unsigned int i = 0; i < gridx; i++) {
			for(unsigned int j = 0; j < gridy; j++) {
				float w = 2.0/(float) gridx;
				float h = 2.0/(float) gridy;
				float x = (float) i/(float) gridx;
				float y = 1.0 - 0.5*h - (float) j/(float) gridy;
				View *view;
				if(i!=j) {
					view = controller->createView(viewScatter, viewScatter);
					assert(view);
					view->setMargins(5,5,5,5);
				} else {
					view = controller->createView(viewHist, viewHist);
					assert(view);
					view->setPropertyInt("View.Font Size", 10);
					view->setMargins(5,5,5,60);
				}
				view->setPropertyInt("Grid.Tics X", 0);
				view->setPropertyInt("Grid.Tics Y", 0);
				view->setPropertyBool("View.transparent", true);
				view->setLocation(2.0*x-1.0,2.0*y-1.0 + h);
				view->setSize(w,h);
				view->setPropertyInt("Data.PointSize",5);
				view->setPropertyStringList("Data.Y", properties[j], typeElement);
				view->setPropertyStringList("Data.X", properties[i], typeElement);
			}
		}
  }
};

Shortcut * createShortcutScatterplotMatrix(string name, string viewScatter, string viewHist, string typeElement) {
	return new ShortcutScatterplotMatrix(name, viewScatter, viewHist, typeElement);
}